package cn.huaqingcheng.tool.core;

import org.jetbrains.annotations.Contract;

/**
 * 字符串相关工具
 **/
@SuppressWarnings("unused")
public interface StrTool extends StringPool, CharacterPool {

    /**
     * 全都是空?
     *
     * @param str 多个待测试的字符串
     * @return 如果全都为空, 返回 true; 任意一个不是空, 返回 false;
     * @apiNote 如果入参为空, 也返回 true (全都是空)
     * @see #hasEmpty(String...)
     */
    static boolean isEmptyAll(String... str) {
        if (str == null) {
            return true;
        }
        for (String s : str) {
            if (isNotEmpty(s)) {
                return false;
            }
        }

        return true;
    }

    /**
     * 字符串不是空
     *
     * @param str 待测试字符串
     */
    @Contract(value = "null -> false", pure = true)
    static boolean isNotEmpty(String str) {
        return str != null && !str.isEmpty();
    }

    /**
     * 全都不是空
     *
     * @param str 待测试的多个字符串
     * @return 如果任意一个字符串为空, 返回 false; 否则 为 true;
     * @apiNote 如果入参为空, 也返回 true;
     * @see #hasEmpty(String...)
     */
    static boolean isNotEmptyAll(String... str) {
        for (String s : str) {
            if (isEmpty(s)) {
                return false;
            }
        }

        return true;
    }

    /**
     * 任意一个字符串是空
     *
     * @param str 多个待测试的字符串
     * @return 任意一个字符串为空, 返回 true; 全都非空 返回 false
     * @apiNote 如果入参为空, 始终返回 true (有空值)
     * @see #isNotEmptyAll(String...)
     */
    static boolean hasEmpty(String... str) {
        if (str == null || str.length == 0) {
            return true;
        }

        for (String s : str) {
            if (isEmpty(s)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 是空白字符
     *
     * @see String#isBlank()
     */
    @Contract(value = "null -> true", pure = true)
    static boolean isBlank(String str) {
        return str == null || str.isBlank();
    }

    /**
     * 不是空白字符
     *
     * @see String#isBlank()
     * @see #isBlank(String)
     */
    @Contract(value = "null -> false", pure = true)
    static boolean isNotBlank(String str) {
        return str != null && !str.isBlank();
    }

    /**
     * 忽略大小写的 {@link String#startsWith(String)}
     *
     * @param target 目标字符串
     * @param start  期望的开始字符串, 忽略大小写
     */
    @Contract(value = "_, null -> fail; null, !null -> false", pure = true)
    static boolean startWithIgnoreCase(String target, String start) {
        if (start == null) {
            throw new IllegalArgumentException();
        }
        if (isEmpty(target)) {
            return false;
        }

        return target.toLowerCase().startsWith(start.toLowerCase());
    }

    /**
     * 删除字符串前后空格 {@link String#trim()}
     *
     * @param s 允许为 null 的字符串
     * @return 永远非空的字符串
     */
    static String trim(String s) {
        if (s == null) {
            return EMPTY;
        }
        return s.trim();
    }

    /**
     * 移除后缀
     *
     * @param old 原字符串
     * @param rep 指定后缀
     */
    static String removeSuffix(String old, String rep) {
        return hasEmpty(old, rep) || !old.endsWith(rep)
               ? old
               : old.substring(0, old.length() - rep.length());
    }

    /**
     * 字符串是空白
     */
    @Contract(value = "null -> true", pure = true)
    static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }

}
